package com.itcast.demo_one.kotlin

//fun main(args: Array<String>) {
//    // 非空类型
//    /*var name: String? = ""
//    name = null // 报错
//    println( name?.length ?: -1)*/
//
//    // 延迟初始化赋值
//    lateinit var name: String
//
//}


class FoodDeliveryApp {
    // 餐厅菜单 - 需要从网络加载后才能使用
    // 使用 lateinit 表示"稍后一定会初始化"
    lateinit var restaurantMenu: List<String>

    // 用户地址 - 需要用户选择后才能确定
    lateinit var deliveryAddress: String

    // 初始化函数 - 相当于用户打开APP
    fun initializeApp() {
        println("=== 外卖APP启动 ===")

        // 模拟网络请求加载菜单
        loadMenuFromServer()

        // 模拟用户选择地址
        selectAddress()

        // 使用菜单
        showMenu()

        // 使用地址
        startDelivery()
    }

    private fun loadMenuFromServer() {
        println("从服务器加载菜单...")
        restaurantMenu = listOf("汉堡", "薯条", "可乐", "鸡块")
        println("菜单加载完成!")
    }

    private fun selectAddress() {
        println("用户选择送货地址...")
        deliveryAddress = "北京市海淀区中关村大街123号"
        println("地址已设置!")
    }

    fun showMenu() {
        // 使用前检查是否已初始化
        if (::restaurantMenu.isInitialized) {
            println("\n今日菜单:")
            restaurantMenu.forEachIndexed { i, item ->
                println("${i + 1}. $item")
            }
        } else {
            println("菜单未加载，请稍后再试")
        }
    }

    fun startDelivery() {
        if (::deliveryAddress.isInitialized) {
            println("\n正在送货到: $deliveryAddress")
            println("预计30分钟送达!")
        } else {
            println("请先设置送货地址")
        }
    }
}

fun main() {
    val app = FoodDeliveryApp()

    // 错误尝试：在初始化前使用
    try {
        println("尝试在初始化前显示菜单:")
        app.showMenu() // 这里会抛出异常
    } catch (e: UninitializedPropertyAccessException) {
        println("错误: ${e.message}\n")
    }

    // 正确流程：先初始化再使用
    app.initializeApp()

    // 再次尝试使用菜单
    println("\n用户浏览菜单:")
    app.showMenu()
}